package com.sjh.lib_app.baseui

import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.sjh.baseui.widget.SimpleTitleView
import com.scwang.smartrefresh.layout.SmartRefreshLayout
import com.sjh.baseutils.loading.LoadingType
import com.sjh.lib_app.LoadType
import com.sjh.lib_app.R
import com.sjh.lib_app.statusMananger.StatusManager
import com.sjh.lib_app.statusMananger.defWidget.DefPageType
import com.sjh.lib_app.statusMananger.defWidget.DefPageUtils
import com.sjh.lib_app.statusMananger.defWidget.LoadErrorStatusView


/**
 * 作者：PC on 2020/8/11 09:37
 * 邮箱：wang_kita@163.com
 *
 * SimpleTitleView+SmartRefreshLayout+RecyclerView
 * 带下拉刷新和 分页加载效果的BaseListActivity基类
 */
abstract class BaseListActivity<T> : BaseActivity() {
    private var mTitleView: SimpleTitleView? = null
    private lateinit var mRecyclerView: RecyclerView
    private lateinit var mSmartRefresh: SmartRefreshLayout
    private lateinit var mStatusManager: StatusManager
    private var pageIndex = 1 //分页的下标，第一页1
    private var pageSize = 10 //每页返回条数，默认10

    /**
     * 页面的xml布局文件
     */
    override fun onCreateRootView() =
        R.layout.activity_base_list

    /**
     * 初始化控件
     */
    override fun onInitView(savedInstanceState: Bundle?) {
        mSmartRefresh = findViewById(R.id.smartRefresh)
        mRecyclerView = findViewById(R.id.recyclerView)
        mTitleView = findViewById(R.id.titleView)
        //初始化顶部标题栏
        initTitle(mTitleView)
        //初始化SmartRefreshLayout
        mSmartRefresh.apply {
            //默认禁用下拉刷新和加载更多
            setEnableRefresh(false)
            setEnableLoadMore(false)
            //设置刷新和加载更多监听
            setOnRefreshListener {
                pageIndex = 1
                requestData(LoadType.LOAD_REFRESH)
            }
            setOnLoadMoreListener{
                requestData(LoadType.LOAD_MORE)
            }
        }
        //默认LinearLayoutManager，如果需要GridLayoutManager自行设置
        mRecyclerView.layoutManager = LinearLayoutManager(this)
        //在这里设置里的adapter适配器
        setAdapter(mRecyclerView)
        //在这里根据需要可以重写加载状态管理器
        setStatusManager()
        //第一次网络请求
        requestData(LoadType.LOAD_INIT)
    }

    override fun initData() {

    }

    /**
     * 头部数据
     */
    open fun initTitle(titleView: SimpleTitleView?){
        titleView?.setOnLeftClick { onBackPressed()}
    }

    /**
     * 设置是否可刷新
     * boo  true 刷新， false不可刷新
     */
    fun setEnableRefresh(boo: Boolean) {
        mSmartRefresh.setEnableRefresh(boo)
    }

    /**
     * 设置是否可加载分页
     * boo  true 加载分页， false不可加载分页
     */
    fun setEnableLoadMore(boo: Boolean) {
        mSmartRefresh.setEnableLoadMore(boo)
    }

    /**
     * 设置默认加载的状态管理器
     * 需要的时候可以重写该方法
     */
    open fun setStatusManager() {
        mStatusManager =
            DefPageUtils.getDefPage(this, mSmartRefresh, DefPageType.COMMON) {
                if (LoadErrorStatusView.LOAD_ERROR_RELOAD.equals(it)) {
                    requestData(LoadType.LOAD_INIT)
                }
            }
    }

    /**
     * 设置适配器
     */
    abstract fun setAdapter(recyclerView: RecyclerView)


    /**
     * 数据请求方法
     * LOAD_INIT   页面初始化数据
     * LOAD_REFRESH  页面刷新数据
     * LOAD_MORE 页面加载更多数据
     */
    fun requestData(loadType: LoadType, loadingType: LoadingType = LoadingType.NONE){
        if (loadType == LoadType.LOAD_MORE) pageIndex++
        val prams = mutableMapOf(
            "page" to if(loadType != LoadType.LOAD_MORE) "1" else pageIndex.toString(),
            "page_size" to pageSize.toString()
        )
        httpRequest(loadType, prams, loadingType)
    }

    /**
     * 需要在这里实现http网络请求
     */
    abstract fun httpRequest(loadType: LoadType, prams: MutableMap<String, String>, loadingType: LoadingType)

    /**
     * 设置adapter新数据
     */
    abstract fun setNewData(data: List<T>?)

    /**
     * 为adapter添加更多数据
     */
    abstract fun addMoreData(data: List<T>?)

    /**
     * 加载开始
     * 仅初始化数据时才显示加载页
     */
    fun onStart(loadType: LoadType) {
        when (loadType) {
            LoadType.LOAD_INIT -> mStatusManager.showLoadingStatus()
        }
    }

    /**
     * 数据加载成功
     */
    open fun onSuccess(loadType: LoadType, data: List<T>?) {
        when (loadType) {
            LoadType.LOAD_INIT, LoadType.LOAD_REFRESH -> {
                mSmartRefresh.finishRefresh(200)
                if (data.isNullOrEmpty()) {
                    mStatusManager.showEmptyStatus()
                    mSmartRefresh.setNoMoreData(true)
                } else {
                    mStatusManager.showContextStatus()
                    mSmartRefresh.setNoMoreData(false)
                }
                setNewData(data)
            }
            LoadType.LOAD_MORE -> {
                if (data.isNullOrEmpty()) {
                    mSmartRefresh.finishLoadMoreWithNoMoreData()
                } else {
                    addMoreData(data)
                    mSmartRefresh.finishLoadMore()
                    mSmartRefresh.setNoMoreData(false)
                }

            }
        }
    }

    /**
     * 加载失败的情况
     */
    fun onError(loadType: LoadType) {
        when (loadType) {
            LoadType.LOAD_INIT -> mStatusManager.showErrorStatus()
            LoadType.LOAD_REFRESH -> mSmartRefresh.finishRefresh(false)
            LoadType.LOAD_MORE -> {
                mSmartRefresh.finishLoadMore(false)
                //如果加载更多失败的话 pageIndex--， 因为在加载前已经 pageIndex++
                pageIndex--
            }
        }
    }

}